package com.qf.commons.redis.utils;

import com.qf.commons.core.utils.ApplicationUtils;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;

/**
 * 分布式锁的工具类
 * author Ken
 * create_time 2022/11/15
 */
@Slf4j
public class RsLock {

    private static RedissonClient redisson;

    static {
        redisson = ApplicationUtils.getBean(RedissonClient.class);
    }

    private static ThreadLocal<RLock> threadLocal = new ThreadLocal<>();

    /**
     * 添加分布式锁
     */
    public static void lock(String key){
        log.debug("[get lock] 尝试获取分布式锁 - {}", key);
        RLock lock = redisson.getLock(key);
        //阻塞式的方法 一直会阻塞到拿到锁为止
        lock.lock();
        //将当前对象设置到ThreadLocal中
        threadLocal.set(lock);
        log.debug("[get lock] 获取分布式锁 - {}", key);
        //拿到锁返回true，拿不到锁返回false，不会阻塞等待
//        lock.tryLock();
        //在等待锁的基础上添加一个过期时间
//        lock.tryLock(10, TimeUnit.DAYS);
    }

    /**
     * 解除分布式锁
     */
    public static void unlock(){
        RLock rLock = threadLocal.get();
        if (rLock != null && rLock.isLocked()) {
            rLock.unlock();
            log.debug("[unlock] 解除分布式锁 - {}", rLock.getName());
        }
        //一定要回收资源
        threadLocal.remove();
    }
}
